#include <iostream>
#include <mutex>
#include <condition_variable>
#include <thread>

class Foo
{
public:
    Foo() : first_done(false), second_done(false) {}

    void first()
    {
        std::unique_lock<std::mutex> lock(mtx);
        // 执行 first 方法cd
        std::cout << "first" << std::endl;
        first_done = true; // 标记 first 方法已执行
        cv.notify_all();   // 通知其他线程
    }

    void second()
    {
        std::unique_lock<std::mutex> lock(mtx);
        // 等待 first 方法执行完成
        cv.wait(lock, [this]
                { return first_done; });
        // 执行 second 方法
        std::cout << "second" << std::endl;
        second_done = true; // 标记 second 方法已执行
        cv.notify_all();    // 通知其他线程
    }

    void third()
    {
        std::unique_lock<std::mutex> lock(mtx);
        // 等待 second 方法执行完成
        cv.wait(lock, [this]
                { return second_done; });
        // 执行 third 方法
        std::cout << "third" << std::endl;
    }

private:
    std::mutex mtx;             // 互斥锁
    std::condition_variable cv; // 条件变量
    bool first_done;            // 标记 first 方法是否执行完成
    bool second_done;           // 标记 second 方法是否执行完成
};


int main()
{
    Foo foo;

    // 创建三个线程
    std::thread t1(&Foo::first, &foo);
    std::thread t2(&Foo::second, &foo);
    std::thread t3(&Foo::third, &foo);

    // 等待线程结束
    t1.join();
    t2.join();
    t3.join();

    return 0;
}